package cn.itsource.service.impl;

import cn.itsource.domain.CourseType;
import cn.itsource.mapper.CourseTypeMapper;
import cn.itsource.query.CourseTypeQuery;
import cn.itsource.result.JSONResult;
import cn.itsource.result.PageList;
import cn.itsource.service.ICourseTypeService;
import cn.itsource.vo.CrumbsVo;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author Jason
 * @since 2022-09-01
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    //查询课程分类树型数据
    @Override
    @Cacheable(cacheNames = "course", key = "'courseTypeTreeData'")
    public JSONResult treeData() {
        //先查询所有分类
        List<CourseType> allCourseTypes = super.selectList(null);

        //装一级分类
        List<CourseType> firstCourseTypes = new ArrayList<>();

        for (CourseType courseType : allCourseTypes) {
            if(courseType.getPid() == null || courseType.getPid().longValue() == 0){
                //说明是一级分类
                firstCourseTypes.add(courseType);
            }
            else{
                //非一级：二级、三级、四级、N级
                //此时需要找自己的上级，再次遍历所有数据，根据pId查找id相等的记录，就查到上级了
                for (CourseType parentCourseType : allCourseTypes) {
                    //这里的courseType肯定是非一级了，所以获取父级ID去比对
                    if(courseType.getPid().longValue() == parentCourseType.getId().longValue()){
                        //比对成功，说明courseType找到了上级，那么就将自己信息添加到上级的children中即可
                        parentCourseType.getChildren().add(courseType);
                        //已经找到上级了，不需要继续查找了，所以break
                        break;
                    }
                }
            }
        }
        return JSONResult.success(firstCourseTypes);
    }
    //查询课程分类树型数据
    @Override
    public JSONResult treeData1() {
        //先查询所有分类
        List<CourseType> allCourseTypes = super.selectList(null);

        //装一级分类
        List<CourseType> firstCourseTypes = new ArrayList<>();

        //把所有分类存到一个HashMap中
        HashMap<Long, CourseType> allCourseTypesMaps = new HashMap<>(allCourseTypes.size());
        for (CourseType obj : allCourseTypes) {
            allCourseTypesMaps.put(obj.getId(), obj);
        }

        for (CourseType courseType : allCourseTypes) {
            if(courseType.getPid() == null || courseType.getPid().longValue() == 0){
                //查找一级分类
                firstCourseTypes.add(courseType);
            }
            else{
                //非一级分类，肯定有父分类
                CourseType parentType = allCourseTypesMaps.get(courseType.getPid());
                parentType.getChildren().add(courseType);
            }
        }
        return JSONResult.success(firstCourseTypes);
    }

 /*   and和andNew区别
    //and()
//mybatis-plus
ew.eq("is_delete",1).and().like("name",name).or().like("code",name);
//sql语句
    select * from student where is_delete = 1 and name like "hh" or code like "hh";

    //andNew()
//mybatis-plus
ew.eq("is_delete",1).andNew().like("name",name).or().like("code",name);
//sql语句
    select * from student where is_delete = 1 and (name like "hh" or code like "hh");*/
// @PostMapping(value = "/pagelist")分页查询：
// public JSONResult pageList(@RequestBody CourseTypeQuery query)
// {
//     Page<CourseType> page = new Page<CourseType>(query.getPage(),query.getRows());
//     Wrapper wrapper = new EntityWrapper();
//     wrapper
//             .eq("pid", query.getPid())
//             .andNew()
//             .like("name", query.getKeyword())
//             .or()
//             .like("description", query.getKeyword());
//     courseTypeService.selectPage(page, wrapper);
//     return JSONResult.success(new PageList<CourseType>(page.getTotal(), page.getRecords()));
// }

    /**
     * 课程分类面包屑
     * 1、校验参数
     * 2、根据当前课程分类ID查询课程分类详情
     * 3、得到课程分类path
     * 4、通过“.”分割path，得到多个分类的ID集合，而且是上上级、上级、当前级的顺序，不会乱
     * 5、批量查询出多个分类对象
     * 6、循环分类，每次循环需要创建一个CrumbsVo，把当前分类装到ownerCourseType
     *    为当前分类查询同级分类列表，装到CrumbsVo的otherCourseTypes
     */
    @Override
    public JSONResult crumbs(Long courseTypeId) {
        /**
         * 1、根据 courseTypeId 查询详情，得到courseType对象
         * 2、得到path字段，根据.进行分割，得到所有父节点ID
         * 3、根据每个父节点ID查询详情，然后查询相同分节点的集合，就是兄弟节点集合
         */
        List<CrumbsVo> list = new ArrayList<>();

        CourseType courseType = super.selectById(courseTypeId);
        String path = courseType.getPath();
        String[] arr = path.split("\\.");
        CrumbsVo vo = null;
        for (String s : arr) {
            Long id = Long.valueOf(s);
            vo = new CrumbsVo();
            CourseType temp = super.selectById(id);
            //根据 temp 的pid查询数据
            Wrapper<CourseType> wrapper = new EntityWrapper<>();
            wrapper.eq("pid", temp.getPid())
                    .ne("id", id);
            List<CourseType> brotherList = super.selectList(wrapper);

            vo.setOwnerCourseType(temp);
            vo.setOtherCourseTypes(brotherList);
            list.add(vo);
        }
        return JSONResult.success(list);
    }

}
